#!/bin/bash

# MySQL连接信息
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_HOST="localhost"
MYSQL_PORT="3306"

# SQL文件目录 - 可以修改为存放SQL备份文件的目录路径
# 默认使用当前目录 "."
SQL_DIR="."

# 执行模式开关 - 设置为true时仅模拟执行（测试日志输出），设置为false时实际执行还原操作
DRY_RUN=true

# 输出颜色定义
GREEN="\033[0;32m"
RED="\033[0;31m"
YELLOW="\033[0;33m"
BLUE="\033[0;34m"
NC="\033[0m" # No Color

echo -e "${YELLOW}===== MySQL数据库自动还原脚本 =====${NC}"
echo -e "数据库服务器: ${MYSQL_HOST}:${MYSQL_PORT}"
echo -e "数据库用户名: ${MYSQL_USER}"
echo -e "执行模式: ${BLUE}$([ "$DRY_RUN" = true ] && echo "模拟执行（仅日志输出）" || echo "实际执行（还原数据库）")${NC}"
echo

# 提示用户输入MySQL密码
if [ -z "$MYSQL_PASSWORD" ]; then
    read -s -p "请输入MySQL密码: " MYSQL_PASSWORD
    echo
fi

# 检查MySQL连接
echo -e "${YELLOW}正在测试MySQL连接...${NC}"
if [ "$DRY_RUN" = true ]; then
    echo -e "${BLUE}[模拟] ${YELLOW}测试MySQL连接命令:${NC} mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p'****' -e 'SELECT VERSION();'"
    # 模拟连接成功
    echo -e "${GREEN}[模拟] MySQL连接测试成功!${NC}"
    echo
else
    # 在Linux环境中安全执行MySQL连接测试
    mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SELECT VERSION();" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo -e "${RED}MySQL连接失败，请检查连接信息!${NC}"
        exit 1
    fi
    echo -e "${GREEN}MySQL连接成功!${NC}"
    echo
fi

# 备份结果日志
LOG_FILE="restore_log_$(date +%Y%m%d_%H%M%S).txt"
touch "$LOG_FILE"
echo "数据库还原日志 - $(date)" > "$LOG_FILE"
echo "服务器: $MYSQL_HOST:$MYSQL_PORT" >> "$LOG_FILE"
echo "用户: $MYSQL_USER" >> "$LOG_FILE"
echo "----------------------------------------" >> "$LOG_FILE"

# 统计信息
TOTAL_FILES=0
SUCCESS_COUNT=0
FAILED_COUNT=0

# 检查SQL目录是否存在
if [ ! -d "$SQL_DIR" ]; then
    echo -e "${RED}错误：SQL目录 '$SQL_DIR' 不存在！${NC}"
    exit 1
fi

# 检查SQL目录中是否有.sql文件
if [ -z "$(ls -A "$SQL_DIR"/*.sql 2>/dev/null)" ]; then
    echo -e "${RED}警告：在目录 '$SQL_DIR' 中未找到任何.sql文件！${NC}"
    echo -e "请检查SQL_DIR配置是否正确。"
    exit 1
fi

# 遍历SQL目录中的所有.sql文件
for sql_file in "$SQL_DIR"/*.sql; do
    # 检查文件是否存在（当目录中没有.sql文件时，需要过滤掉通配符本身）
    if [ ! -f "$sql_file" ]; then
        continue
    fi
    
    # 获取文件名（不含路径）用于显示和日志
    file_name=$(basename "$sql_file")
    TOTAL_FILES=$((TOTAL_FILES + 1))
    
    # 从文件名中提取数据库名（去掉日期部分和.sql后缀）
    # 文件名格式: dbname_YYYYMMDD_HHMMSS.sql
    # 使用更直接的方法提取数据库名
    # 移除最后15个字符（_YYYYMMDD_HHMMSS）和.sql后缀
    # 首先移除.sql后缀
    db_name_no_ext="${file_name%.sql}"
    # 然后移除最后15个字符（包含下划线和日期时间）
    db_name="${db_name_no_ext%_????????_??????}"
    
    # 如果提取失败，使用完整文件名（不含.sql后缀）作为数据库名
    if [ -z "$db_name" ] || [ "$db_name" = "$db_name_no_ext" ]; then
        db_name="$db_name_no_ext"
    fi
    
    # 特殊处理文件名中可能包含的特殊字符
    db_name=$(echo "$db_name" | tr -cd '[:alnum:]_-')
    
    echo -e "${YELLOW}正在处理文件: $file_name${NC}"
    echo -e "目标数据库: ${GREEN}$db_name${NC}"
    
    if [ "$DRY_RUN" = true ]; then
        # 模拟执行模式
        echo -e "${BLUE}[模拟] ${YELLOW}创建数据库命令:${NC} mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p'****' -e 'CREATE DATABASE IF NOT EXISTS \`$db_name\`;'"
        echo -e "${BLUE}[模拟] ${GREEN}数据库 $db_name 创建成功!${NC}"
        
        echo -e "${BLUE}[模拟] ${YELLOW}导入数据命令:${NC} mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p'****' '$db_name' < '$sql_file'"
        echo -e "${BLUE}[模拟] ${GREEN}数据库 $db_name 数据导入成功!${NC}"
        
        # 记录到日志
        echo "$file_name - [模拟] 成功还原到数据库: $db_name" >> "$LOG_FILE"
        SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
    else
        # 实际执行模式 - 使用Linux兼容的命令格式
        # 创建数据库（如果不存在）- 使用服务端默认字符集
        echo -e "正在创建数据库..."
        mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS \`$db_name\`;" > /dev/null 2>&1
        if [ $? -ne 0 ]; then
            echo -e "${RED}创建数据库 $db_name 失败!${NC}"
            echo "$file_name - 创建数据库失败" >> "$LOG_FILE"
            FAILED_COUNT=$((FAILED_COUNT + 1))
            continue
        fi
        
        # 还原数据库
        echo -e "正在导入数据..."
        mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$db_name" < "$sql_file"
        if [ $? -eq 0 ]; then
            echo -e "${GREEN}数据库 $db_name 还原成功!${NC}"
            echo "$file_name - 成功还原到数据库: $db_name" >> "$LOG_FILE"
            SUCCESS_COUNT=$((SUCCESS_COUNT + 1))
        else
            echo -e "${RED}数据库 $db_name 还原失败!${NC}"
            echo "$file_name - 还原失败" >> "$LOG_FILE"
            FAILED_COUNT=$((FAILED_COUNT + 1))
        fi
    fi
    
    echo -e "----------------------------------------"
done

# 输出统计信息
if [ "$DRY_RUN" = true ]; then
    echo -e "${YELLOW}===== 模拟执行完成 =====${NC}"
    echo -e "${BLUE}[模拟] ${YELLOW}总文件数: $TOTAL_FILES${NC}"
    echo -e "${BLUE}[模拟] ${GREEN}成功还原: $SUCCESS_COUNT${NC}"
    echo -e "${BLUE}[模拟] ${RED}还原失败: $FAILED_COUNT${NC}"
    echo -e "\n${YELLOW}模拟执行完成，请检查日志确认无误后，将DRY_RUN设置为false进行实际还原操作。${NC}"
    
    # 记录统计信息到日志
    echo "----------------------------------------" >> "$LOG_FILE"
    echo "[模拟] 统计信息:" >> "$LOG_FILE"
    echo "[模拟] 总文件数: $TOTAL_FILES" >> "$LOG_FILE"
    echo "[模拟] 成功还原: $SUCCESS_COUNT" >> "$LOG_FILE"
    echo "[模拟] 还原失败: $FAILED_COUNT" >> "$LOG_FILE"
    echo "[模拟] 日志生成时间: $(date)" >> "$LOG_FILE"
else
    echo -e "${YELLOW}===== 还原完成 =====${NC}"
    echo -e "${YELLOW}总文件数: $TOTAL_FILES${NC}"
    echo -e "${GREEN}成功还原: $SUCCESS_COUNT${NC}"
    echo -e "${RED}还原失败: $FAILED_COUNT${NC}"
    echo -e "\n${YELLOW}详细信息请查看日志文件: $LOG_FILE${NC}"
    
    # 记录统计信息到日志
    echo "----------------------------------------" >> "$LOG_FILE"
    echo "统计信息:" >> "$LOG_FILE"
    echo "总文件数: $TOTAL_FILES" >> "$LOG_FILE"
    echo "成功还原: $SUCCESS_COUNT" >> "$LOG_FILE"
    echo "还原失败: $FAILED_COUNT" >> "$LOG_FILE"
    echo "日志生成时间: $(date)" >> "$LOG_FILE"
fi